package com.example.UniformException;

import org.springframework.stereotype.Component;

import java.lang.annotation.*;

/*
统一异常处理的核心机制
核心注解@ControllerAdvice - 全局异常处理的"容器"
作用：定义一个全局的异常处理类，拦截所有Controller抛出的异常。它创建了一个集中管理所有异常的地方。没有它，异常处理只能分散在各个Controller内部。

@ControllerAdvice是类级别注解。

源码：理解Spring如何通过这个注解找到并注册全局异常处理器*/


/**
 * @ControllerAdvice 源码深度解析
 * 作用：定义全局异常处理类，拦截所有Controller抛出的异常
 */
@Target(ElementType.TYPE)          // 只能应用于类
@Retention(RetentionPolicy.RUNTIME) // 运行时保留，Spring通过反射读取
@Documented                         // 包含在JavaDoc中
@Component                          // 被Spring容器管理
public @interface ControllerAdvice {

    /**
     * 指定要增强的包路径
     * 例如：@ControllerAdvice("com.example.controller")
     * 作用：限定异常处理的范围，提高性能
     */
    String[] value() default {};
    String[] basePackages() default {};

    /**
     * 通过类引用方式指定包
     * 类型安全，重构友好
     * 例如：@ControllerAdvice(basePackageClasses = UserController.class)
     */
    Class<?>[] basePackageClasses() default {};

    /**
     * 指定要增强的特定Controller类
     * 可以精确控制增强范围
     * 例如：@ControllerAdvice(assignableTypes = {UserController.class})
     */
    Class<?>[] assignableTypes() default {};

    /**
     * 指定要增强的带有特定注解的Controller
     * 例如只增强带有@RestController注解的类
     */
    Class<? extends Annotation>[] annotations() default {};
}
